import { BaseRequestConfig } from './types';

/**
 * 配置处理工具类，提供通用的配置合并和处理方法
 */
export class ConfigUtils {
  /**
   * 合并多个配置对象
   * @param configs 配置对象数组
   * @returns 合并后的配置对象
   */
  static mergeConfigs<T extends BaseRequestConfig>(
    ...configs: Partial<T>[]
  ): T {
    return configs.reduce(
      (merged, config) => ({ ...merged, ...config }),
      {}
    ) as T;
  }

  /**
   * 合并多个请求头对象
   * @param headerSets 请求头对象数组
   * @returns 合并后的请求头对象
   */
  static mergeHeaders(
    ...headerSets: Record<string, string>[]
  ): Record<string, string> {
    return headerSets.reduce(
      (merged, headers) => ({ ...merged, ...headers }),
      {}
    );
  }

  /**
   * 设置超时时间，优先使用配置中的超时时间
   * @param defaultTimeout 默认超时时间
   * @param configTimeout 配置中的超时时间
   * @returns 最终的超时时间
   */
  static resolveTimeout(
    defaultTimeout?: number,
    configTimeout?: number
  ): number | undefined {
    return configTimeout ?? defaultTimeout;
  }

  /**
   * 设置上传进度回调，优先使用配置中的回调
   * @param defaultCallback 默认回调
   * @param configCallback 配置中的回调
   * @returns 最终的回调函数
   */
  static resolveUploadProgress(
    defaultCallback?: (progressEvent: ProgressEvent) => void,
    configCallback?: (progressEvent: ProgressEvent) => void
  ): ((progressEvent: ProgressEvent) => void) | undefined {
    return configCallback ?? defaultCallback;
  }

  /**
   * 设置中止信号，优先使用配置中的信号
   * @param defaultSignal 默认信号
   * @param configSignal 配置中的信号
   * @returns 最终的中止信号
   */
  static resolveSignal(
    defaultSignal?: AbortSignal,
    configSignal?: AbortSignal
  ): AbortSignal | undefined {
    return configSignal ?? defaultSignal;
  }
}
